/**
 * @Author：徐志荣
 * @Date：2023/9/5 上午 10:09
 */
public class Day0905 {
    public static void main(String[] args) {
        int[] nums = {0,0,0,1};
        int n = longestOnes(nums,4);
        System.out.println( "1004. 最大连续1的个数 III"+ n);

        int[] nums2 = {1,1,4,2,3};
        System.out.println("1658. 将 x 减到 0 的最小操作数 : "+ minOperations(nums2,5));
    }
    public static int longestOnes(int[] nums, int k) {
        int ret = 0;
        for(int left = 0,right = 0,zero = 0;right<nums.length;right++){
            //进窗口操作
            if(nums[right] == 0){
                zero++;
            }
            while(zero>k){
                //出窗口
                if(nums[left++] == 0){
                    zero--;
                }
            }
            ret = Math.max(ret,right-left+1);
        }
        return ret;
    }
    public static int minOperations(int[] nums, int x) {
        int sum = 0;
        //计算数组的和
        for(int a :nums){
            sum+=a;
        }
        int target = sum-x;
        //处理细节
        if(target <0){
            return -1;
        }

        int ret = -1;
        for(int left = 0,right = 0,tmp = 0;right<nums.length;right++){
            //进窗口
            tmp+=nums[right];
            while(tmp>target){
                //出窗口
                tmp-=nums[left];
                left++;
            }
            //走到这里，就是 tmp 小于等于 target的情况
            if(tmp == target){
                ret = Math.max(ret,right-left+1);
            }

        }
        // ret 最大字符数组 （nums.length - x的一个要求）
        // 要返回：nums.length - ret 的长度  才是我们要的 （可以将x减到0的最小操作数 个数 ）
        return ret == -1 ? ret:(nums.length-ret);
    }
}
